package chapter4_对象组合.实例封闭;

import annotation.GuardedBy;
import annotation.ThreadSafe;

import java.util.HashSet;
import java.util.Set;

/**
 * 实例封闭
 *
 * 分析：HashSet:myset虽然不是线程安全的类，但是它被定义为类PersonSet私有，并且只能通过addPerson和containsPerson同步方法(PersonSet内置锁)访问
 * 结论：PersonSet是一个线程安全的类
 * 注意：Person对象的访问并不是线程安全的!!!
 */
@ThreadSafe
public class PersonSet {
    @GuardedBy("this")
    private final Set<Person> mySet = new HashSet<>();

    public synchronized void addPerson(Person p) {
        mySet.add(p);
    }

    public synchronized boolean containsPerson(Person p) {
        return mySet.contains(p);
    }
}

class Person {

}